package com.bite.order.config;

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

public class CustomLoadBalancerConfiguration {

    /**
     * 在 Spring 应用上下文中注册一个随机负载均衡器。当有服务需要调用其他服务时：
     * 1. 通过服务名称从注册中心获取所有可用实例
     * 2. 使用 RandomLoadBalancer 随机选择一个实例
     * 3. 将请求路由到选中的实例
     *
     * LoadBalancerClientFactory.PROPERTY_NAME 常量，用于从环境变量中获取要负载均衡的服务名称
     * getLazyProvider() 获取一个懒加载的服务实例列表提供者，参数指定了服务名称和提供者类型 ServiceInstanceListSupplier.class
     * @param environment Spring 环境对象，用于获取配置属性
     * @param loadBalancerClientFactory 负载均衡器客户端工厂
     * @return
     */
    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
        //获取服务名称
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        //创建并返回一个随机负载均衡器
        return new RandomLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class),
                name);
    }
}
